﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace hercules.Models.Negocio
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    using hercules.Models.Dados;

    /// <summary>
    /// Classe responsável pela lógica de negócio dos produtos das Vendas.
    /// </summary>
    public class NegocioProdutoVenda
    {
        /// <summary>
        /// Objeto genérico que faz a persistência dos dados.
        /// </summary>
        private readonly IRepositorioGenerico<ProdutoVenda, ControleEstoqueEntities> repositorioProdutoVenda;

        /// <summary>
        /// Initializes a new instance of the <see cref="NegocioProdutoVenda"/> class.
        /// Construtor para inicializar os atributos.
        /// </summary>
        public NegocioProdutoVenda()
        {
            this.repositorioProdutoVenda = new RepositorioGenerico<ProdutoVenda, ControleEstoqueEntities>("chave");
        }

        /// <summary>
        /// Método para fazer a inserção de produtoVenda.
        /// </summary>
        /// <param name="produtoVenda">Objeto que irá ser persistido</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Inserir(ProdutoVenda produtoVenda)
        {
            this.repositorioProdutoVenda.Inserir(produtoVenda);
            return this.repositorioProdutoVenda.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para fazer a alteração de produtoVenda.
        /// </summary>
        /// <param name="objeto">Objeto que terá seus dados alterados</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Editar(ProdutoVenda objeto)
        {
            ProdutoVenda produtoVenda = this.Obter(objeto.numeroNota, objeto.idProduto);
            produtoVenda.idProduto = objeto.idProduto;
            produtoVenda.preco = objeto.preco;
            produtoVenda.quantidade = objeto.quantidade;

            return this.repositorioProdutoVenda.SaveChanges() > 0;
        }

        /// <summary>
        /// Método para remover um produtoVenda utilizando o número da nota da venda.
        /// </summary>
        /// <param name="numNota">Número da nota que será removido.</param>
        /// <param name="idProduto">Código do Produto que será removido.</param>
        /// <returns>True e a inserção foi concluida com sucesso, caso contrário false</returns>
        public bool Remover(int numNota, int idProduto)
        {
            this.repositorioProdutoVenda.Remover(produtoVenda => produtoVenda.numeroNota == numNota && produtoVenda.idProduto == idProduto);
            return this.repositorioProdutoVenda.SaveChanges() > 0;
        }

        /// <summary>
        /// Método que retorna uma lista com todos os produtoVendas.
        /// </summary>
        /// <returns>A lista com os produtoVendas.</returns>
        public List<ProdutoVenda> ObterTodos()
        {
            return this.repositorioProdutoVenda.ObterTodos().ToList();
        }

        /// <summary>
        /// Método que retorna um produtoVenda passando o número da nota.
        /// </summary>
        /// <param name="numNota">Número da nota do produto da venda a ser retornado.</param>
        /// <param name="idProduto">Código do produto.</param>
        /// <returns>O produtoVenda desejado.</returns>
        public ProdutoVenda Obter(int numNota, int idProduto)
        {
            return this.repositorioProdutoVenda.ObterEntidade(produtoVenda => produtoVenda.numeroNota == numNota && produtoVenda.idProduto == idProduto);
        }

        /// <summary>
        /// Método para fazer a comparação entre dois produtos da venda.
        /// </summary>
        /// <param name="produtoVenda1">Primeiro produto da Venda.</param>
        /// <param name="produtoVenda2">Segundo produto da Venda.</param>
        /// <returns>True se eles forem iguais, caso contrário false.</returns>
        public bool Equals(ProdutoVenda produtoVenda1, ProdutoVenda produtoVenda2)
        {
            if (produtoVenda1.numeroNota.Equals(produtoVenda2.numeroNota) &&
                produtoVenda1.idProduto.Equals(produtoVenda2.idProduto) &&
                produtoVenda1.quantidade.Equals(produtoVenda2.quantidade) && 
                produtoVenda1.preco.Equals(produtoVenda2.preco))
            {
                return true;
            }

            return false;
        }
    }
}